package com.example.service;

import com.example.bean.User;
import com.example.controller.UserController;
import com.example.dao.UserDao;
import com.example.util.UuidUtil;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.cache.annotation.CacheConfig;
import org.springframework.cache.annotation.CachePut;
import org.springframework.cache.annotation.Cacheable;
import org.springframework.stereotype.Service;
import org.springframework.transaction.annotation.Transactional;

import java.util.List;

//@CacheConfig(cacheNames = "user")
@Service
public class UserService {
    private UuidUtil uuidUtil = new UuidUtil();
    /**
     * 获取日志记录器
     */
    private Logger logger = LoggerFactory.getLogger(UserController.class);
    @Autowired
    private UserDao userDao;

    /**
     * 将方法的运行结果进行缓存，以后要是再有相同的数据，直接从缓存中获取，不用调用方法
     * CacheManager中管理多个Cache组件，对缓存的真正CRUD操作在Cache组件中，每个缓存组件都有自己的唯一名字；
     *
     * 属性：
     *  CacheName/value:指定存储缓存组件的名字
     *  key:缓存数据使用的key,可以使用它来指定。默认是使用方法参数的值，或方法的返回值
     *  编写Spel表达式：#id 参数id的值， #a0/#p0 #root.args[0]
     *  keyGenerator:key的生成器，自己可以指定key的生成器的组件id
     *  key/keyGendertor二选一使用
     *
     *  cacheManager指定Cache管理器，或者cacheReslover指定获取解析器
     *  condition:指定符合条件的情况下，才缓存；ne 相对应不等
     *  unless：否定缓存，unless指定的条件为true，方法的返回值就不会被缓存，可以获取到结果进行判断
     *  sync:是否使用异步模式，unless不支持
     *
     *
     */
//    @Cacheable(cacheNames = {"name"})
//    @CachePut(value="name")
    @Cacheable(value = "user", key = "#name" , condition  = "#name eq 'cc'")
    public User findUserByName(String name) {
        User user = userDao.findUserByName(name);
        System.out.println("测试----------------------"+user);
        return user;
    }

    public List<User> findAll() {
        List<User> users = userDao.findAll();
        return users;
    }

    public Integer updateUserById(User user) {
        int count = userDao.updateUserById(user);
        return count;
    }

    public Boolean deleteUserById(String id) {
        try {
            return userDao.deleteUserById(id);
        } catch (Exception e) {
            logger.info(e.toString());
            return false;
        }
    }

    public Integer insertUser(User user) {
        user.setId(uuidUtil.getNewId());
        Integer count = userDao.insertUser(user);
        return count;
    }

    /**
     * 模拟银行转账,事务处理机制
     */
    @Transactional
    public void changeMoney() {
        User user1 = new User();
        user1.setId("22");
        user1.setName("aaaaa");
        userDao.updateUserById(user1);
        // 模拟转账过程中可能遇到的意外状况,加上了@Transactional注解,就不会改变,不加前面的回执行完,值会变
        int temp = 1 / 0;

        User user2 = new User();
        user1.setId("22");
        user1.setName("aaaaa");
        userDao.updateUserById(user2);
    }


}
